package com.github.yangyishe.p300;

import java.util.Arrays;

/**
 * 205. 同构字符串
 * https://leetcode.cn/problems/isomorphic-strings/?envType=study-plan-v2&envId=top-interview-150
 *
 * 给定两个字符串 s 和 t ，判断它们是否是同构的。
 *
 * 如果 s 中的字符可以按某种映射关系替换得到 t ，那么这两个字符串是同构的。
 *
 * 每个出现的字符都应当映射到另一个字符，同时不改变字符的顺序。不同字符不能映射到同一个字符上，相同字符只能映射到同一个字符上，字符可以映射到自己本身。
 *
 *
 *
 * 示例 1:
 *
 * 输入：s = "egg", t = "add"
 * 输出：true
 * 示例 2：
 *
 * 输入：s = "foo", t = "bar"
 * 输出：false
 * 示例 3：
 *
 * 输入：s = "paper", t = "title"
 * 输出：true
 *
 *
 * 提示：
 *
 * 1 <= s.length <= 5 * 104
 * t.length == s.length
 * s 和 t 由任意有效的 ASCII 字符组成
 */
public class Problem205 {
    public static void main(String[] args) {
        String s="foo";
        String t="bar";

        Problem205 problem205 = new Problem205();
        boolean isomorphic = problem205.isIsomorphic(s, t);
        System.out.println(isomorphic);
    }

    /**
     * 要求:
     * 同构传既要保证数量一致, 也需要保证顺序一致
     *
     * 思路:
     * 考虑使用哈希表(或一个长度为256的数组)记录不同字符在新字符串中的映射
     * 由于字符是一一映射的, 为了保证唯一性, 可创建两个哈希表
     * 其一用来记录新字符映射到旧字符;
     * 其二用来记录旧字符映射到新字符;
     * 初始化值使用-1表示
     *
     * 依次匹配每一位, 如果某一位不是空且不匹配, 则返回false
     *
     * @param s
     * @param t
     * @return
     */
    public boolean isIsomorphic(String s, String t) {
        int[] new2Old=new int[256];
        Arrays.fill(new2Old, -1);

        int[] old2New=new int[256];
        Arrays.fill(old2New,-1);

        char oldChar;
        char newChar;
        for(int i=0;i<s.length();i++){
            oldChar=s.charAt(i);
            newChar=t.charAt(i);
            if(new2Old[newChar]==-1&&old2New[oldChar]==-1){
                new2Old[newChar]=oldChar;
                old2New[oldChar]=newChar;
            }else if(new2Old[newChar]!=oldChar||old2New[oldChar]!=newChar){
                return false;
            }

        }

        return true;
    }
}
